home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / FFPLOG.SA < prev    next >
Text File  |  1989-08-30  |  8KB  |  163 lines

  1.          TTL       FAST FLOATING POINT LOG (FFPLOG)
  2. ***************************************
  3. * (C) COPYRIGHT 1981 BY MOTOROLA INC. *
  4. ***************************************
  5.  
  6. *************************************************
  7. *                  FFPLOG                       *
  8. *       FAST FLOATING POINT LOGORITHM           *
  9. *                                               *
  10. *  INPUT:   D7 - INPUT ARGUMENT                 *
  11. *                                               *
  12. *  OUTPUT:  D7 - LOGORITHMIC RESULT TO BASE E   *
  13. *                                               *
  14. *     ALL OTHER REGISTERS TOTALLY TRANSPARENT   *
  15. *                                               *
  16. *  CODE SIZE: 184 BYTES   STACK WORK: 38 BYTES  *
  17. *                                               *
  18. *  CONDITION CODES:                             *
  19. *        Z - SET IF THE RESULT IS ZERO          *
  20. *        N - SET IF RESULT IN IS NEGATIVE       *
  21. *        V - SET IF INVALID NEGATIVE ARGUMENT   *
  22. *            OR ZERO ARGUMENT                   *
  23. *        C - UNDEFINED                          *
  24. *        X - UNDEFINED                          *
  25. *                                               *
  26. *                                               *
  27. *  NOTES:                                       *
  28. *    1) SPOT CHECKS SHOW ERRORS BOUNDED BY      *
  29. *       5 X 10**-8.                             *
  30. *    2) NEGATIVE ARGUMENTS ARE ILLEGAL AND CAUSE*
  31. *       THE "V" BIT TO BE SET AND THE ABSOLUTE  *
  32. *       VALUE USED INSTEAD.                     *
  33. *    3) A ZERO ARGUMENT RETURNS THE LARGEST     *
  34. *       NEGATIVE VALUE POSSIBLE WITH THE "V" BIT*
  35. *       SET.                                    *
  36. *                                               *
  37. *  TIME: (8MHZ NO WAIT STATES ASSUMED)          *
  38. *                                               *
  39. *        TIMES ARE VERY DATA SENSITIVE WITH     *
  40. *        SAMPLES RANGING FROM 170 TO 556        *
  41. *        MICROSECONDS                           *
  42. *                                               *
  43. *************************************************
  44.          PAGE
  45. FFPLOG   IDNT  1,2 FFP LOG
  46.  
  47.          OPT       PCS
  48.          SECTION   9
  49.  
  50.          XDEF      FFPLOG                        ENTRY POINT
  51.  
  52.          XREF      9:FFPHTHET                    HYPERTANGENT TABLE
  53.          XREF      9:FFPADD,9:FFPDIV,9:FFPSUB,9:FFPMUL ARITHMETIC PRIMITIVES
  54.          XREF      9:FFPTNORM          TRANSCENDENTAL NORMALIZE ROUTINE
  55.          XREF      FFPCPYRT            COPYRIGHT STUB
  56.  
  57. FPONE    EQU       $80000041           FLOATING VALUE FOR ONE
  58. LOG2     EQU       $B1721840           LOG(2) = .6931471805
  59.  
  60. **************
  61. * LOG ENTRY  *
  62. **************
  63.  
  64. * INSURE ARGUMENT POSITIVE
  65. FFPLOG   TST.B     D7                  ? TEST SIGN
  66.          BEQ.S     FPLZRO              BRANCH ARGUMENT ZERO
  67.          BPL.S     FPLOK               BRANCH ALRIGHT
  68.  
  69. * ARGUMENT IS NEGATIVE - USE THE ABSOLUTE VALUE AND SET THE "V" BIT
  70.          AND.B     #$7F,D7             TAKE ABSOLUTE VALUE
  71.          BSR.S     FPLOK               FIND LOG(ABS(X))
  72. *PSETV   OR.B      #$02,CCR            SET OVERFLOW BIT
  73. FPSETV   DC.L      $003C0002           ***ASSEMBLER ERROR***
  74.          RTS                           RETURN TO CALLER
  75.  
  76. * ARGUMENT IS ZERO - RETURN LARGEST NEGATIVE NUMBER WITH "V" BIT
  77. FPLZRO   MOVE.L    #-1,D7              RETURN LARGEST NEGATIVE
  78.          BRA       FPSETV              RETURN WITH "V" BIT SET
  79.  
  80. * SAVE WORK REGISTERS AND STRIP EXPONENT OFF
  81. FPLOK    MOVEM.L   D1-D6/A0,-(SP)      SAVE ALL WORK REGISTERS
  82.          MOVE.B    D7,-(SP)            SAVE ORIGINAL EXPONENT
  83.          MOVE.B    #64+1,D7            FORCE BETWEEN 1 AND 2
  84.          MOVE.L    #FPONE,D6           LOAD UP A ONE
  85.          MOVE.L    D7,D2               COPY ARGUMENT
  86.          BSR       FFPADD              CREATE ARG+1
  87.          EXG.L     D7,D2               SWAP RESULT WITH ARGUMENT
  88.          BSR       FFPSUB              CREATE ARG-1
  89.          MOVE.L    D2,D6               PREPARE FOR DIVIDE
  90.          BSR       FFPDIV              RESULT IS (ARG-1)/(ARG+1)
  91.          BEQ.S     FPLNOCR             ZERO SO CORDIC NOT NEEDED
  92. * CONVERT TO BIN(31,29) PRECISION
  93.          SUB.B     #64+3,D7            ADJUST EXPONENT
  94.          NEG.B     D7                  FOR SHIFT NECESSARY
  95.          CMP.B     #31,D7              ? INSURE NOT TOO SMALL
  96.          BLS.S     FPLSHF              NO, GO SHIFT
  97.          MOVE.L    #0,D7               FORCE TO ZERO
  98. FPLSHF   LSR.L     D7,D7               SHIFT TO BIN(31,29) PRECISION
  99.  
  100. *****************************************
  101. * CORDIC CALCULATION REGISTERS:         *
  102. * D1 - LOOP COUNT   A0 - TABLE POINTER  *
  103. * D2 - SHIFT COUNT                      *
  104. * D3 - Y'   D5 - Y                      *
  105. * D4 - X'   D6 - Z                      *
  106. * D7 - X                                *
  107. *****************************************
  108.  
  109.          MOVE.L    #0,D6               Z=0
  110.          MOVE.L    #1<<29,D5           Y=1
  111.          LEA       FFPHTHET,A0         TO INVERSE HYPERBOLIC TANGENT TABLE
  112.          MOVE.L    #22,D1              LOOP 23 TIMES
  113.          MOVE.L    #1,D2               PRIME SHIFT COUNTER
  114.          BRA.S     CORDIC              ENTER CORDIC LOOP
  115.  
  116. * CORDIC LOOP
  117. FPLPLS   ASR.L     D2,D4               SHIFT(X')
  118.          SUB.L     D4,D5               Y = Y - X'
  119.          ADD.L     (A0),D6             Z = Z + HYPERTAN(I)
  120. CORDIC   MOVE.L    D7,D4               X' = X
  121.          MOVE.L    D5,D3               Y' = Y
  122.          ASR.L     D2,D3               SHIFT(Y')
  123. FPLNLP   SUB.L     D3,D7               X = X - Y'
  124.          BPL.S     FPLPLS              BRANCH NEGATIVE
  125.          MOVE.L    D4,D7               RESTORE X
  126.          ADD.L     #4,A0               TO NEXT TABLE ENTRY
  127.          ADD.B     #1,D2               INCREMENT SHIFT COUNT
  128.          LSR.L     #1,D3               SHIFT(Y')
  129.          DBRA      D1,FPLNLP           AND LOOP UNTIL DONE
  130.  
  131. * NOW CONVERT TO FLOAT AND ADD EXPONENT*LOG(2) FOR FINAL RESULT
  132.          MOVE.L    #0,D7               DEFAULT ZERO IF TOO SMALL
  133.          BSR       FFPTNORM            FLOAT Z
  134.          BEQ.S     FPLNOCR             BRANCH IF TOO SMALL
  135.          ADD.B     #1,D6               TIMES TWO
  136.          MOVE.L    D6,D7               SETUP IN D7 IN CASE EXP=0
  137. FPLNOCR  MOVE.L    D7,D2               SAVE RESULT
  138.          MOVE.L    #0,D6               PREPARE ORIGINAL EXPONENT LOAD
  139.          MOVE.B    (SP)+,D6            LOAD IT BACK
  140.          SUB.B     #64+1,D6            CONVERT EXPONENT TO BINARY
  141.          BEQ.S     FPLZPR              BRANCH ZERO PARTIAL HERE
  142.          MOVE.B    D6,D1               SAVE SIGN BYTE
  143.          BPL.S     FPLPOS              BRANCH POSITIVE VALUE
  144.          NEG.B     D6                  FORCE POSITIVE
  145. FPLPOS   ROR.L     #8,D6               PREPARE TO CONVERT TO INTEGER
  146.          MOVE.L    #$47,D5             SETUP EXPONENT MASK
  147. FPLNORM  ADD.L     D6,D6               SHIFT TO LEFT
  148.          DBMI      D5,FPLNORM          EXP-1 AND BRANCH IF NOT NORMALIZED
  149.          MOVE.B    D5,D6               FIX IN EXPONENT
  150.          AND.B     #$80,D1             EXTRACT SIGN
  151.          OR.B      D1,D6               INSERT SIGN IN
  152.          MOVE.L    #LOG2,D7            MULTIPLY EXPONENT BY LOG(2)
  153.          BSR       FFPMUL              MULTIPLY D6 AND D7
  154.          MOVE.L    D2,D6               NOW ADD CORDIC RESULT
  155.          BSR       FFPADD              FOR FINAL ANSWER
  156.  
  157. FPLZPR   MOVEM.L   (SP)+,D1-D6/A0      RESTORE REGISTERS
  158.          RTS                           RETURN TO CALLER
  159.  
  160.  
  161.          END
  162.  
  163.